import { changeCount, delSelect, getCartList } from '@/api/cart'
import { Toast } from 'vant'

export default {
  namespaced: true,
  state () {
    return {
      cartList: [],
      isLoading: false // 请求响应状态（修复信息没返回的情况下渲染购物车界面）
    }
  },
  mutations: {
    // 提供一个设置cartList的mutations
    setCartList (state, newList) {
      state.cartList = newList
    },
    // 请求响应状态
    setLoading (state, status) {
      state.isLoading = status
    },
    toggleCheck (state, goodsId) {
      // 让对应的 id 的项状态取反
      const goods = state.cartList.find(item => item.goods_id === goodsId)
      goods.isChecked = !goods.isChecked
    },
    // 自己实现的全选反选
    setIsAll (state, isAllChecked) {
      state.cartList.forEach((item) => {
        item.isChecked = !isAllChecked
      })
    },
    // 规范（包括变量名）
    toggleAllCheck (state, flag) {
      state.cartList.forEach((item) => {
        item.isChecked = flag
      })
    },
    // setGoodsNum (state, goodsId) {
    //   state.cartList.find(item => item.goods_id === goodsId)
    // },
    changeCount (state, { goodsId, goodsNum }) {
      const goods = state.cartList.find(item => {
        return item.goods_id === goodsId
      })
      goods.goods_num = goodsNum
    }
  },
  actions: {
    async getCartAction (context) {
      const { data } = await getCartList()
      // 后台返回的数据中，不包含复选框的选中状态，为了实现将来的功能
      // 需要手动维护数据，给每一项，添加一个 isChecked 状态（标记当前商品是否选中）
      data.list.forEach(item => {
        item.isChecked = true
      })
      context.commit('setCartList', data.list)
      context.commit('setLoading', true)
    },
    // async setGoodsNum (context, obj) {
    //   const res = await updateCart(obj) // 这里传整个对象会报错
    //   console.log(res)
    //   context.commit('setGoodsNum', obj.goodsId)
    // },
    async changeCountAction (context, obj) {
      const { goodsId, goodsNum, goodsSkuId } = obj
      await changeCount(goodsId, goodsNum, goodsSkuId)
      // TODO: 后端商品数量不足
      context.commit('changeCount', { goodsId, goodsNum })
    },
    // 删除购物车
    async delSelect (context) {
      const selCartList = context.getters.selCartList
      const cartIds = selCartList.map(item => item.id)
      await delSelect(cartIds)
      Toast('删除成功')
      // 重新拉取数据
      context.dispatch('getCartAction')
    }
  },
  getters: {
    // 获取所有商品的累加总数
    cartTotal (state) {
      return state.cartList.reduce((sum, item, index) => sum + item.goods_num, 0)
    },
    // 选中的商品项
    selCartList (state) {
      return state.cartList.filter(item => item.isChecked)
    },
    // 选中的总数
    selCount (state, getters) {
      // getters函数可以传入另一个getters
      return getters.selCartList.reduce((sum, item, index) => sum + item.goods_num, 0)
    },
    // 选中的总价
    selPrice (state, getters) {
      return getters.selCartList.reduce((sum, item, index) => {
        return sum + item.goods_num * item.goods.goods_price_min
      }, 0).toFixed(2) // 保留两位小数
    },
    // 是否全选
    isAllChecked (state, getters) {
      return state.cartList.every(item => item.isChecked) // python 的 all()
      // return getters.selCount === getters.cartTotal
    }
  }
}
